package com.babel.util.tools;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * myenum 工具类
 * 
 * @author tangzhi
 */
public class EnumUtil {

	private EnumUtil() {
	}

	public static <T extends Enum<T>> int encode(EnumSet<T> set) {
		if (set == null) {
			return 0;
		}

		int ret = 0;

		for (T val : set) {
			ret |= 1 << val.ordinal();
		}

		return ret;
	}

	public static <T extends Enum<T>> EnumSet<T> decode(Class<T> type, int code) {
		Map<Integer, T> codeMap = new HashMap<Integer, T>();
		for (T val : EnumSet.allOf(type)) {
			codeMap.put(val.ordinal(), val);
		}
		EnumSet<T> result = EnumSet.noneOf(type);
		while (code != 0) {
			int ordinal = Integer.numberOfTrailingZeros(code);
			code ^= Integer.lowestOneBit(code);
			result.add(codeMap.get(ordinal));
		}
		return result;
	}

	/**
	 * 根据value获取enum对象
	 * 
	 * @return
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getEnumByValue(String value, Class<T> c) {
		if (!ValidateTools.isEmpty(value)) {
			for (Object o : c.getEnumConstants()) {
				if (o.toString().equals(value)) {
					return (T) o;
				}
			}
		}
		return null;
	}

	/**
	 * 根据名称获取枚举对象
	 * @param <T>
	 * @param Value
	 * @param type
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends Enum<T>> T getEnumByName(String Value,
			Class<T> type) {
		for (Enum<?> e : EnumSet.allOf(type)) {
			if (e.name().equals(Value)) {
				return (T) e;
			}
		}
		return null;
	}
	
	/**
	 * 根据名称获取枚举对象
	 * @param <T>
	 * @param Value
	 * @param type
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T extends Enum<T>> T getEnumByOrdinal(int Value,
			Class<T> type) {
		for (Enum<?> e : EnumSet.allOf(type)) {
			if (e.ordinal() == Value) {
				return (T) e;
			}
		}
		return null;
	}
	
	/**
	 * 将枚举转换成map数据
	 * @param <T>
	 * @param type
	 * @return
	 */
	public static<T extends Enum<T>>  Map<String, String> getEnumMap(Class<T> type) {
		Map<String, String> map = new LinkedHashMap<String, String>();
		for (Enum<?> e : EnumSet.allOf(type)) {
			map.put(e.name(), e.toString());
		}
		return map;
	}
	
	public static<T extends Enum<T>> String[] getEnumNames(Class<T> type) {
		Object [] objs = EnumSet.allOf(type).toArray();
		String [] strs = new String[objs.length];
		for(int i = 0; i < objs.length; i ++) {
			strs[i] = objs[i].toString();
		}
		return strs;
	}
}